package tas.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import tas.dao.DaoTurno;
import tas.domain.Turnos;
import tas.sql.ConectaDb;

public class DaoTurnoImpl implements DaoTurno {

    private final ConectaDb db;

    public DaoTurnoImpl() {
        this.db = new ConectaDb();
    }

    @Override
    public List<Object[]> turnosQry(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + " TUR.IDAÑO, "
                + " TUR.IDUNIDADEJECUTORA, "
                + " TUR.IDCORTE, "
                + " TUR.IDTURNO,  "
                + " TUR.DESCRIPCIONTURNO,  "
                + " TO_CHAR(tur.HORAINGRESO, 'HH24:MI' ) || '-'|| TO_CHAR(tur.HORASALIDA, 'HH24:MI' ) HORA, "
                + " TO_CHAR(tur.HORAINICIOREF, 'HH24:MI' ) || '-'|| TO_CHAR(tur.HORAFINREF, 'HH24:MI' ) HORAREF, "
                + " TO_CHAR(TUR.FECHAINICIO, 'DD/MM/YYYY' ), "
                + " est.descripcionestado, "
                + " TUR.IDESTADO "
                + " FROM BDTAS.TURNO tur "
                + " left join BDTAS.estado est "
                + " on (tur.idestado=est.idestado) "
                + " WHERE "
                + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[10];

                    f[0] = rs.getObject(1); // IDAÑO
                    f[1] = rs.getObject(2); // IDUNIDADEJECUTORA
                    f[2] = rs.getObject(3); // IDCORTE
                    f[3] = rs.getObject(4); // IDTURNO
                    f[4] = rs.getObject(5); // DESCRIPCIONTURNO
                    f[5] = rs.getObject(6); // HORA
                    f[6] = rs.getObject(7); // HORAREF
                    f[7] = rs.getObject(8); // FECHAINICIO
                    f[8] = rs.getObject(9); // descripcionestado
                    f[9] = rs.getObject(10); //IDESTADO
                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String turnosIns(Turnos turnos) {
        String result = null;
        String sql = "     INSERT INTO BDTAS.TURNO "
                + "( IDAÑO, IDUNIDADEJECUTORA, IDCORTE, "
                + "DESCRIPCIONTURNO, HORAINGRESO, HORASALIDA, HORAINICIOREF, HORAFINREF, IDESTADO, FECHAINICIO  )"
                + " VALUES  (?,?,?,?,TO_DATE(?, 'HH24:MI'), TO_DATE(?, 'HH24:MI'), TO_DATE(?, 'HH24:MI'), TO_DATE(?, 'HH24:MI'), ?, TO_DATE(?, 'DD/MM/YYYY'))";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, turnos.getIdaño());
                ps.setString(2, turnos.getIdunidEjec());
                ps.setString(3, turnos.getIdcorte());
                ps.setString(4, turnos.getDescripcionturno());
                ps.setString(5, turnos.getHoraingreso());
                ps.setString(6, turnos.getHorasalida());
                ps.setString(7, turnos.getHorainicioref());
                ps.setString(8, turnos.getHorafinref());
                ps.setInt(9, turnos.getIdestado());
                ps.setString(10, turnos.getIdfechainicio());

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public Turnos turnosGet(String año, String unidejecu, String corte, Integer idturno) {
        Turnos turnos = null;

        String sql = "SELECT "
                + "  DESCRIPCIONTURNO, "
                + "  TO_CHAR(FECHAINICIO,'DD/MM/YYYY') , "
                + "  TO_CHAR(HORAINGRESO, 'HH24:MI') HORAINGRESO, "
                + "  TO_CHAR(HORASALIDA, 'HH24:MI')  HORASALIDA, "
                + "  TO_CHAR(HORAINICIOREF, 'HH24:MI') HORAINICIOREF, "
                + "  TO_CHAR(HORAFINREF, 'HH24:MI')  HORAFINREF, "
                + "  IDESTADO "
                + "  FROM BDTAS.TURNO "
                + "  WHERE IDAÑO=? AND IDUNIDADEJECUTORA=?"
                + "  AND IDCORTE=? AND IDTURNO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, año);
                ps.setString(2, unidejecu);
                ps.setString(3, corte);
                ps.setInt(4, idturno);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    turnos = new Turnos();

                    turnos.setIdaño(año);
                    turnos.setIdunidEjec(unidejecu);
                    turnos.setIdcorte(corte);
                    turnos.setIdturno(idturno);
                    turnos.setDescripcionturno(rs.getString(1));
                    turnos.setIdfechainicio(rs.getString(2));
                    turnos.setHoraingreso(rs.getString(3));
                    turnos.setHorasalida(rs.getString(4));
                    turnos.setHorainicioref(rs.getString(5));
                    turnos.setHorafinref(rs.getString(6));

                    Integer idestadox = Integer.valueOf(rs.getString(7));

                    turnos.setIdestado(idestadox);

                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return turnos;
    }

    @Override
    public String turnosUpd(Turnos turnos) {
        String result = null;
        String sql = "UPDATE BDTAS.TURNO SET "
                + " DESCRIPCIONTURNO=?, "
                + " HORAINGRESO=TO_DATE(?, 'HH24:MI'), "
                + " HORASALIDA=TO_DATE(?, 'HH24:MI'), "
                + " HORAINICIOREF=TO_DATE(?, 'HH24:MI'), "
                + " HORAFINREF=TO_DATE(?, 'HH24:MI'), " 
                + " FECHAINICIO=TO_DATE(?, 'DD/MM/YYYY'), "
                + " IDESTADO=? "
                + " WHERE IDAÑO=? AND IDUNIDADEJECUTORA=?"
                + " AND IDCORTE=? AND IDTURNO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, turnos.getDescripcionturno());
                ps.setString(2, turnos.getHoraingreso());
                ps.setString(3, turnos.getHorasalida());
                ps.setString(4, turnos.getHorainicioref());
                ps.setString(5, turnos.getHorafinref());
                ps.setString(6, turnos.getIdfechainicio());
                 ps.setInt(7, turnos.getIdestado());
                ps.setString(8, turnos.getIdaño());        
                ps.setString(9, turnos.getIdunidEjec());  
                ps.setString(10, turnos.getIdcorte());  
                ps.setInt(11, turnos.getIdturno());

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public Integer turnosIdGet(String año, String unidejecu, String corte) {

        Integer idturno = null;

        String sql = "SELECT NVL(MAX(IDTURNO), 0)+1  IDTURNO "
                + "FROM BDTAS.TURNO WHERE IDAÑO=? "
                + "AND IDUNIDADEJECUTORA=? "
                + "AND IDCORTE=? ";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, año);
                ps.setString(1, unidejecu);
                ps.setString(1, corte);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    idturno = rs.getInt(1);
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return idturno;
    }

}
